package cn.iocoder.yudao.module.locale.dal.mysql.tabledata;

import java.util.*;
import java.util.function.Consumer;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.locale.controller.app.tabledata.vo.TableDataConditionReqVO;
import cn.iocoder.yudao.module.locale.dal.dataobject.tabledata.TableDataDO;
import cn.iocoder.yudao.module.locale.utils.LocaleUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.locale.controller.admin.tabledata.vo.*;
import org.apache.skywalking.apm.toolkit.trace.ConsumerWrapper;

/**
 * 表数据国际化 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface TableDataMapper extends BaseMapperX<TableDataDO> {

    default PageResult<TableDataDO> selectPage(TableDataPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<TableDataDO>()
                .eqIfPresent(TableDataDO::getLanguageCode, reqVO.getLanguageCode())
                .likeIfPresent(TableDataDO::getTableName, reqVO.getTableName())
                .eqIfPresent(TableDataDO::getRowId, reqVO.getRowId())
                .likeIfPresent(TableDataDO::getColumnName, reqVO.getColumnName())
                .eqIfPresent(TableDataDO::getColumnRawValue, reqVO.getColumnRawValue())
                .eqIfPresent(TableDataDO::getColumnTranslatedValue, reqVO.getColumnTranslatedValue())
                .eqIfPresent(TableDataDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(TableDataDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(TableDataDO::getId));
    }

    default List<TableDataDO> selectList(TableDataConditionReqVO conditionVO) {
        final String languageCode = LocaleUtil.getLanguageCode(conditionVO.getLanguage());
        final List<TableDataConditionReqVO.TableCondition> conditions = conditionVO.getTableConditionList();

        // 构建查询条件
        final LambdaQueryWrapperX<TableDataDO> query = new LambdaQueryWrapperX<TableDataDO>()
                .eq(TableDataDO::getLanguageCode, languageCode);

        // 构建 OR 关系的查询条件
        query.and(wrapper -> {
            for (TableDataConditionReqVO.TableCondition condition : conditions) {
                final String tableName = condition.getTableName();
                final List<String> rowIds = condition.getRowIds();
                wrapper.or(innerWrapper -> innerWrapper.eq(TableDataDO::getTableName, tableName)
                        .in(TableDataDO::getRowId, rowIds));
            }
        });

        // 执行查询
        final List<TableDataDO> list = selectList(query);

        return list;
    }


}